Computer operating systems typically include a memory allocator that divides up large areas of memory into smaller blocks and allocates those smaller blocks to programs running on the computer. Although use of a memory allocator tends to result in more efficient utilization of the memory available in the computer, memory allocators are not without their problems. One such problem is that oftentimes the order in which memory allocators allocate blocks of memory to programs is reasonably deterministic, which creates a potential vulnerability that could be leveraged by malware or other malicious programs to attack the computer.